package com.zzl.myblog.View.Fragment;

import android.content.Intent;
import android.icu.text.Edits;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import com.youth.banner.Banner;
import com.youth.banner.BannerConfig;
import com.zzl.myblog.Bean.ResponseBean.BannerBean;
import com.zzl.myblog.Bean.ResponseBean.TopArticleBean;
import com.zzl.myblog.Bean.ResponseBean.UserCollectArticleBean;
import com.zzl.myblog.Bean.ViewBean.ArticleBean;
import com.zzl.myblog.R;
import com.zzl.myblog.Utils.DateUtil;
import com.zzl.myblog.Utils.GlideImageLoader;
import com.zzl.myblog.Utils.HttpUtil;
import com.zzl.myblog.Utils.LogUtil;
import com.zzl.myblog.Utils.responseUtility;
import com.zzl.myblog.View.Activity.WebActivity;
import com.zzl.myblog.View.Adapter.TopArticleAdapter;

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * 原始的四个碎片自带缓存，无需懒加载
 */
public class MainFragment extends Fragment {
    static String username; // 用户账号

    int pageIndex = 0;

    String TAG = "MainFragment";

    View rootView;

    //碎片中使用butterknife略有不同
    private Unbinder unbinder;

    @BindView(R.id.banner)
    Banner banner;

    @BindView(R.id.smartRefresh)
    SmartRefreshLayout smartRefresh;

    // banner 数据源
    private List<BannerBean.DataBean> bannerDataBeanList;
    ArrayList<String> images = new ArrayList<>();//图片资源集合
    ArrayList<String> titles = new ArrayList<>();//标题集合
    ArrayList<String> webURLs = new ArrayList<>();//web链接结合

    // 推荐文章-数据源
    private List<TopArticleBean.DataBean.DatasBean> topDataBeanList;
    // rv 数据集
    static List<ArticleBean> mList = new ArrayList<>();
    // rv 控件
    @BindView(R.id.rv_top_article)
    RecyclerView mRecyclerView;
    // LinerLayoutManager
    LinearLayoutManager layoutManager;
    // rv适配器
    static TopArticleAdapter topArticleAdapter;

    // 用于模拟加载数据
    AlertDialog alertDialog;

    // 区分是加载Banner or TopArticle
    static final int BANNER = 1;
    static final int TOPARTICLE = 2;

    // 空构造函数
    public MainFragment() {
        // Required empty public constructor
    }

    /**
     * 1. 给bundle传入username
     * 2. 拿到 MainFragment的单例对象
     */
    public static MainFragment newInstance(String username) {
        MainFragment fragment = new MainFragment();

        // 给bundle放入userName
        Bundle bundle = new Bundle();
        bundle.putString("username", username);

        // 给fragment放入bundle
        fragment.setArguments(bundle);

        // 将fragment返回
        return fragment;
    }

    /**
     * 生命周期函数 onCreateView()
     * - 拿到fragment对应的fragment_main.xml样式布局文件view
     * - bufferKnife对布局进行绑定
     * - 获取到username
     * - initData()
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_main, container, false);

        //返回一个Unbinder值（进行解绑），注意这里的this不能使用getActivity()
        unbinder = ButterKnife.bind(this, rootView);

        assert getArguments() != null;//判空处理
        username = getArguments().getString("username");//获取账号
        Log.d(TAG, "onCreateView: username " + username);

        // 初始化data
        initData();

        return rootView;
    }

    /**
     * 初始化视图
     * - 1 初始化顶部轮播图
     * - 2 初始化每日文章列表
     */
    private void initView(int i) {
        // 根据传递到I，初始化不同的部分
        switch (i) {
            case BANNER:
                initBannerView(); // 初始化顶部轮播图
                break;
            case TOPARTICLE:
                initTopArticleView(); // 初始化每日文章
                break;
        }
        // 下拉刷新首页文章[固定拿第0页数据]
        smartRefresh.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                mList.clear();
                HttpUtil.wanAndroid_GET("article/list/0/json", "", new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                        try {
                            String JSON = response.body().string();
                            TopArticleBean topArticleBean = responseUtility.parse_TopArticles(JSON);
                            topDataBeanList = topArticleBean.getData().getDatas();
                            for (TopArticleBean.DataBean.DatasBean item : topDataBeanList) {
                                //文章所需数据 mList
                                ArticleBean articleBean = new ArticleBean(
                                        "" + item.getAuthor(),
                                        "" + item.getTitle(),
                                        "" + DateUtil.timeStampDate(item.getPublishTime() + ""),
                                        "" + item.getChapterName(),
                                        "" + item.getLink()
                                );
                                mList.add(articleBean);
                            }
                            Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
                                smartRefresh.finishRefresh();
                                Toast.makeText(getActivity(), "刷新数据成功！", Toast.LENGTH_SHORT).show();
                                topArticleAdapter.notifyDataSetChanged();
                            });
                        } catch (Exception e) {
                            Log.d(TAG, "onResponse-失败");
                            LogUtil.i(TAG, e.getMessage());
                        }
                    }
                    @Override
                    public void onFailure(Call call, IOException e) {
                        LogUtil.d(TAG, "请求刷新失败！");
                    }
                });
            }
        });
        // 上拉加载更多首页文章
        smartRefresh.setOnLoadMoreListener(refreshLayout -> {
//            List<ArticleBean> ListBridge = new ArrayList<>();
//            if(refreshFlag){ // 第一次”加载更多“
//                for (int j=15;j<20;j++) {// mlist从头减去15条数据 0~19
//                    ListBridge.add(mList.get(j));
//                }
//            }else{
//                for (int j=20;j<25;j++) {// mlist从头减去20条数据 0~24
//                    ListBridge.add(mList.get(j));
//                }
//            }
//            refreshFlag = false;
//            /*
//             * 错误写法：mList = ListBridge;
//             *      mAdapter引用的mList内存地址更改了，也就是 mList直接是 mList = 新List；
//             * 这样子再调用mAdapter.notifyDataSetChanged();是没用的
//             */
//            // 同样将ListBridge的内容给mList，但不会改变mList所指地址
//            mList.clear(); // 清空mlist
//            mList.addAll(ListBridge); // 加入后五个

            // 由于每天请求的数据不是固定的20个数据，所以我们只好每次加载更多时直接把所有的数据都清掉，加载全新的
            mList.clear();

            pageIndex++; // 页数加一
            String url = "article/list/"+pageIndex+"/json";
            LogUtil.i(TAG,url);
            HttpUtil.wanAndroid_GET(url, "", new Callback() {
                @Override
                public void onResponse(Call call, Response response) {
                    try {
                        String JSON = response.body().string();
                        TopArticleBean topArticleBean = responseUtility.parse_TopArticles(JSON);
                        topDataBeanList = topArticleBean.getData().getDatas();
                        for (TopArticleBean.DataBean.DatasBean item : topDataBeanList) {
                            //文章所需数据 mList
                            ArticleBean articleBean = new ArticleBean(
                                    "" + item.getAuthor(),
                                    "" + item.getTitle(),
                                    "" + DateUtil.timeStampDate(item.getPublishTime() + ""),
                                    "" + item.getChapterName(),
                                    "" + item.getLink()
                            );
                            mList.add(articleBean);
                        }
                        Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
                            smartRefresh.finishLoadMore();
                            Toast.makeText(getActivity(), "加载更多！", Toast.LENGTH_SHORT).show();
                            LogUtil.i(TAG,String.valueOf(mList.size()));
                            topArticleAdapter.notifyDataSetChanged();
                            layoutManager.scrollToPosition(0); // 跳到rv第一个子项位置
                        });
                    } catch (Exception e) {
                        Log.d(TAG, "onResponse-失败");
                        LogUtil.i(TAG, e.getMessage());
                    }
                }
                @Override
                public void onFailure(Call call, IOException e) {
                    LogUtil.d(TAG, "请求刷新失败！");
                }
            });
        });
    }

    /**
     * 请求网络ＡＰＩ
     */
    private void initData() {
        alertDialog = new AlertDialog.Builder(Objects.requireNonNull(getActivity()))
                .setMessage("获取首页数据中...")
                .setTitle("MyBlog").create();
        alertDialog.show();//开启alertdialog对话框
        initBannerData();
        initTopArticleData();
    }

    private void initBannerData(){
        HttpUtil.wanAndroid_GET("banner/json", "", new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    //拿到JSON格式的数据
                    final String responseJson = response.body().string();
                    BannerBean BannerBean = responseUtility.parse_banner(responseJson);
                    bannerDataBeanList = BannerBean.getData();
                    for (BannerBean.DataBean item : bannerDataBeanList) {
                        images.add(item.getImagePath());
                        titles.add(item.getTitle());
                        String url = item.getUrl();
                        // webAgent 需要使用 https
                        if (!url.contains("https")) {
                            StringBuffer url_https = new StringBuffer();
                            url_https.append(url).insert(4, "s");
                            url = url_https + "";
                        }
                        webURLs.add(url);
                    }
                    //获取完数据后UI操作
                    //主线程将alertDialog提示隐藏
                    Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
                        // 初始化轮播
                        initView(BANNER);
                    });
                } catch (Exception e) {
                    Log.d(TAG, "初始化项目数据成功");
                    LogUtil.i(TAG, e.getMessage());
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "初始化项目-请求数据失败" + e.getMessage());
            }
        });
    }

    private void initTopArticleData(){
        HttpUtil.wanAndroid_GET("article/list/0/json", "", new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    String JSON = response.body().string();
                    TopArticleBean topArticleBean = responseUtility.parse_TopArticles(JSON);
                    topDataBeanList = topArticleBean.getData().getDatas();
                    for (TopArticleBean.DataBean.DatasBean item : topDataBeanList) {
                        //文章所需数据 mList
                        ArticleBean articleBean = new ArticleBean(
                                "" + item.getAuthor(),
                                "" + item.getTitle(),
                                "" + DateUtil.timeStampDate(item.getPublishTime() + ""),
                                "" + item.getChapterName(),
                                "" + item.getLink()
                        );
                        mList.add(articleBean);
                    }
                    //获取完数据后UI操作，主线程将alertDialog提示隐藏
                    Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
                        // 显示首页文章
                        initView(TOPARTICLE);
                        alertDialog.hide();
                    });
                } catch (Exception e) {
                    Log.d(TAG, "初始化首页文章成功");
                    LogUtil.i(TAG, e.getMessage());
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                LogUtil.d(TAG, "初始化项目-请求数据失败");
            }
        });
    }

    /**
     * 初始化 BannerView
     * - 配置 Banner 图片、样式、标题集合、轮播时间
     * - 设置 BannerListener监听跳转
     * - 启动 Banner
     */
    private void initBannerView() {
        // 设置 banner  图片集合
        banner.setImages(images);
        // 设置 banner  图片加载器
        banner.setImageLoader(new GlideImageLoader());
        // 设置 banner 样式 显示圆形指示器和标题（水平显示）
        banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE);
        //设置指示器位置（当banner模式中有指示器时）
        banner.setIndicatorGravity(BannerConfig.CENTER);
        // 设置 banner 标题集合（如果不传，默认不显示标题）
        banner.setBannerTitles(titles);
        // 设置 banner 自动轮播，默认为ture
        // banner.isAutoPlay(true)
        // 设置轮播图片间隔事件（毫秒），（默认为2000）
        banner.setDelayTime(2500);

        // 设置点击事件，下标从0开始
        // !!! 点击事件必须放到start()前面
        banner.setOnBannerListener(position -> {
            Intent intent = new Intent(getActivity().getApplicationContext(), WebActivity.class);
            intent.putExtra("webURL", webURLs.get(position));
            intent.putExtra("username", username);
            //LogUtil.d(TAG,"banner "+webURLs.get(position)+" "+position);
            startActivity(intent);
        });

        // 进行banner 渲染，banner设置方法全部调用完毕后，最后调用start()
        banner.start();
    }

    /**
     * 初始化 TopArticleView
     * - 配置 recycleView
     * - 设置 setOnItemClickListener
     * - recycleView 和 Adapter 绑定
     */
    private void initTopArticleView() {
        //直接设置为true，当需要改变宽高的时候就用notifyDataSetChanged()去整体刷新一下
        mRecyclerView.setHasFixedSize(true);

        //平常的水平一个item布局的流
        layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        // 设置recycleView的布局效果
        mRecyclerView.setLayoutManager(layoutManager);

        //实例化MyAdapter，并传入mList对象
        topArticleAdapter = new TopArticleAdapter(getContext(),mList);

        //recycleView单击事件
        topArticleAdapter.setOnItemClickListener((view, position) -> {
            String WebURL = mList.get(position).getWebURL(); //拿到当前子项的URL
            Intent intent = new Intent(getActivity().getApplicationContext(), WebActivity.class);
            intent.putExtra("webURL", WebURL);
            intent.putExtra("username", username);
            startActivity(intent);
        });
        //绑定Adapter
        mRecyclerView.setAdapter(topArticleAdapter);
    }

    /**
     可选配置：
     banner.startAutoPlay() 和 banner.stopAutoPlay() 可以增加体验
     */

    /**
     * 进入 onStart() 生命周期
     * banner.startAutoPlay()
     */
    @Override
    public void onStart() {
        super.onStart();
        //开始轮播
        banner.startAutoPlay();
    }

    /**
     * 进入 onStop() 生命周期
     * banner.stopAutoPlay()
     */
    @Override
    public void onStop() {
        super.onStop();
        //结束轮播
        banner.stopAutoPlay();
    }

    /**
     * 进入 onDestroyView（） 生命周期
     * unBinder.unbind() 进行解绑操作
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (alertDialog != null) {
            alertDialog.dismiss();
        }
        unbinder.unbind();
    }
}
